<?php
/*
 * 调用人人网RESTful API的客户端类，本类需要继承RESTClient类方可使用
 * 要求最低的PHP版本是5.2.0，并且还要支持以下库：cURL, Libxml 2.6.0
 * This class for invoke RenRen RESTful Webservice
 * It MUST be extends RESTClient
 * The requirement of PHP version is 5.2.0 or above, and support as below:
 * cURL, Libxml 2.6.0
 *
 * @Modified by mike on 17:54 2011/12/21.
 * @Modified by Edison tsai on 14:41 2011/01/13 for wrap call_id & session_key in this class.
 *
 * @Version: 0.0.5 alpha
 * @Created: 17:09:40 2010/11/23
 * @Author:	Edison tsai<dnsing@gmail.com>
 * @Blog:	http://www.timescode.com
 * @Link:	http://www.dianboom.com
 */

 #Include configure resources

 class RenrenRestApiService extends HttpRequestService
 {

     private $_config;
     private $_postFields    = '';
     private $_params        =    array();
     private $_currentMethod;
     private static $_sigKey = 'sig';
     private $_sig            = '';
     private $_call_id        = '';
    
     private $_keyMapping    = array(
                'api_key'    =>    '',
                'method'    =>    '',
                'v'            =>    '',
                'format'    =>    '',
            );
    
     public function __construct()
     {
         global $config;
        
         parent::__construct();
        
         $this->_config = $config;
        
         if (empty($this->_config->APIURL) || empty($this->_config->APIKey) || empty($this->_config->SecretKey)) {
             throw new exception('Invalid API URL or API key or Secret key, please check config.inc.php');
         }
     }

     /**
      * GET wrapper
      * @param method String
      * @param parameters Array
      * @return mixed
      */
    public function GET()
    {
        $args = func_get_args();
        $this->_currentMethod    = trim($args[0]); #Method
        $this->paramsMerge($args[1])
             ->getCallId()
             ->setConfigToMapping()
             ->generateSignature();

        #Invoke
        unset($args);

        return $this->_GET($this->_config->APIURL, $this->_params);
    }

     /**
      * POST wrapper，基于curl函数，需要支持curl函数才行
      * @param method String
      * @param parameters Array
      * @return mixed
      */
    public function rr_post_curl()
    {
        $args = func_get_args();
        $this->_currentMethod    = trim($args[0]); #Method
        $this->paramsMerge($args[1])
             ->getCallId()
             ->setConfigToMapping()
             ->generateSignature();

        #Invoke
        unset($args);

        return $this->_POST($this->_config->APIURL, $this->_params);
    }
     /**
      * Generate signature for sig parameter
      * @param method String
      * @param parameters Array
      * @return RenRenClient
      */
    private function generateSignature()
    {
        $arr = array_merge($this->_params, $this->_keyMapping);
        ksort($arr);
        reset($arr);
        $str = '';
        foreach ($arr as $k=>$v) {
            $v=$this->convertEncoding($v, $this->_encode, "utf-8");
            $arr[$k]=$v;//转码，你懂得
                $str .= $k.'='.$v;
        }
            
        $this->_params = $arr;
        $str = md5($str.$this->_config->SecretKey);
        $this->_params[self::$_sigKey] = $str;
        $this->_sig = $str;

        unset($str, $arr);

        return $this;
    }

    
     /**
      * Parameters merge
      * @param $params Array
      * @modified by Edison tsai on 15:56 2011/01/13 for fix non-object bug
      * @return RenRenClient
      */
    private function paramsMerge($params)
    {
        $this->_params = $params;
        return $this;
    }

     /**
      * Setting mapping value
      * @modified by Edison tsai on 15:04 2011/01/13 for add call id & session_key
      * @return RenRenClient
      */
    private function setConfigToMapping()
    {
        $this->_keyMapping['api_key']    = $this->_config->APIKey;
        $this->_keyMapping['method']    = $this->_currentMethod;
        $this->_keyMapping['v']            = $this->_config->APIVersion;
        $this->_keyMapping['format']    = $this->_config->decodeFormat;
        return $this;
    }

     private function setAPIURL($url)
     {
         $this->_config->APIURL = $url;
     }

  /**
    * Generate call id
    * @author Edison tsai
    * @created 14:48 2011/01/13
    * @return RenRenClient
    */
    public function getCallId()
    {
        $this->_call_id = str_pad(mt_rand(1, 9999999999), 10, 0, STR_PAD_RIGHT);
        return $this;
    }
    
     public function rr_post_fopen()
     {
         $args = func_get_args();
         $this->_currentMethod    = trim($args[0]); #Method
        $this->paramsMerge($args[1])
             ->getCallId()
             ->setConfigToMapping()
             ->generateSignature();

        #Invoke
        unset($args);

         return $this->_POST_FOPEN($this->_config->APIURL, $this->_params);
     }
     public function rr_photo_post_fopen()
     {
         $args = func_get_args();
         $this->_currentMethod    = trim($args[0]); #Method
        $this->paramsMerge($args[1])
             ->getCallId()
             ->setConfigToMapping()
             ->generateSignature();

        #Invoke
        $photo_files=$args[2];

         unset($args);
         return $this->_photoUpload($this->_config->APIURL, $this->_params, $photo_files);
     }
 }
